home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
fb386
/
tool
/
mondu
/
file_sel.bas
< prev
next >
Wrap
BASIC Source File
|
1995-01-02
|
17KB
|
436 lines
1000 ' ウィンドウ描画プログラム発展型ファイルセレクタ 80
1010 CLEAR ,,100000,40000,10000,20000:DEF FONT "システム 12ドット"
1020 DEFINT A-Z:COLOR ,7,%8:CLS
1029 ' 短形領域(box(i,0),box(i,1))-(box(i,2),box(i,3))が点(x,y)を含むか
1030 DEF FNPB(I)=BOX(I,0)=<MOUSE(0)+WINDOW(0) AND MOUSE(0)+WINDOW(0)=<BOX(I,2) AND BOX(I,1)=<MOUSE(1)+WINDOW(1) AND MOUSE(1)+WINDOW(1)=<BOX(I,3)
1049 ' F-BASIC386用REXユーティリティ(作者:OcToh[オクト])を読み込む
1050 LOADM "bas_lib.rex",0
1059 ' アイコンデータ
1060 ICN_CL&(0)=&H80F0FF:ICN_CL&(1)=&H80A0AA:ICN_CL&(2)=&H80A0AA
1061 ICN_CL&(3)=&H80A0AA:ICN_CL&(4)=&H80A0AA:ICN_CL&(5)=&H80A0AA
1062 ICN_UP&(0)=&H3C180000:ICN_UP&(1)=&H00FFFF7E
1063 ICN_DW&(0)=&H7EFFFF00:ICN_DW&(1)=&H0000183C
1200 ' パレット設定
1201 PALETTE 1,[144, 64,224]:PALETTE 2,[112,160,80]:PALETTE 3,[192,240,128]
1204 PALETTE 4,[144,144,144]:PALETTE 5,[144, 32,96]:PALETTE 6,[192,192,192]
1207 PALETTE 7,[ 96, 96, 96]:PALETTE 8,[ 48, 48,48]:PALETTE 9,[160,176,240]
1210 PALETTE 10,[ 96,240, 96]:PALETTE 11,[208, 80,64]:PALETTE 12,[ 64, 64, 64]
1213 PALETTE 13,[208,180,240]:PALETTE 14,[176,224,48]:PALETTE 15,[240,240,240]
1300 ' マウス表示
1310 MOUSE 0
1329 ' andパターン
1330 M_AND$(0)=CHR$(&H7F,&HFF,&H3F,&HFF,&H1F,&HFF,&HF,&HFF,7,&HFF,3,&HFF,1,&HFF,0,&HFF,0,&H7F,0,&H3F,0,&H1F,0,&H3F,0,&HFF,1,&HFF,&H38,&HFF,&HF9,&HFF)
1331 M_AND$(1)=CHR$(&HFF,&HFE,&HFF,&HFC,&HFF,&HF8,&HFF,&HF0,&HFF,&HE0,&HFF,&HC0,&HFF,&H80,&HFF,0,&HFE,0,&HFC,0,&HF8,0,&HFC,0,&HFF,0,&HFF,&H80,&HFF,&H1C,&HFF,&H9F)
1332 M_AND$(2)=CHR$(&HFC,&H7F,&H38,&H7F,0,&H7F,0,&HFF,0,&H3F,0,&H1F,0,&H3F,0,&H7F,0,&HFF,1,&HFF,3,&HFF,7,&HFF,&HF,&HFF,&H1F,&HFF,&H3F,&HFF,&H7F,&HFF)
1333 M_AND$(3)=CHR$(&HFF,&H1F,&HFF,&H1C,&HFF,&H80,&HFF,0,&HFC,0,&HF8,0,&HFC,0,&HFE,0,&HFF,0,&HFF,&H80,&HFF,&HC0,&HFF,&HE0,&HFF,&HF0,&HFF,&HF8,&HFF,&HFC,&HFF,&HFE)
1334 '
1339 ' ドットパターン
1340 M_DOT$(0)=CHR$(0,0,0,0,&H40,0,&H60,0,&H30,0,&H58,0,&H3C,0,&H5E,0,&H2F,0,&H5F,&H80,&H26,0,&H54,0,&H46,0,4)
1341 M_DOT$(1)=CHR$(0,0,0,0,0,2,0,6,0,&HE,0,&H1E,0,&H3E,0,&H7E,0,&HFE,1,&HFE,0,&H7E,0,&H2E,0,&H62,0,H60)
1342 M_DOT$(2)=CHR$(0,0,3,0,&H43,0,&H66,0,&H56,0,&H2A,&H80,&H55,0,&H2A,0,&H54,0,&H28,0,&H50,0,&H20,0,&H40)
1343 M_DOT$(3)=CHR$(0,0,0,&H40,0,&H20,0,&H32,0,&H1E,0,&HBE,1,&H5E,0,&HAE,0,&H5E,0,&H2E,0,&H16,0,&HA,0,6,0,2)
1344 '
1350 MOUSE 2,M_AND$(0),M_DOT$(0)
1360 MOUSE 1,312,232,1
1999 ' ウィンドウ情報の設定
2000 WINSIGN$="Tiff 読み込み"
2001 WININF(0)=100:WININF(1)=50:WININF(2)=240:WININF(3)=189
2002 BOXNUM=16:DIM BOX(BOXNUM,3)
2003 BOX(15,0)=1:BOX(15,1)=1:BOX(15,2)=238:BOX(15,3)=187
2004 BOX(16,0)=0:BOX(16,1)=0:BOX(16,2)=240:BOX(16,3)=189
2099 '
2100 GOSUB*WINDOW
2110 MOUSE 5
2120 IF RIGHT$(FILENAME$,4)=".TIF" THEN LOAD@ FILENAME$
2130 END
9999 '
10000 *WINDOW
10010 DIM WINBUF(((WININF(2)\8+1)*(WININF(3)+1)*4+1)\2)
10011 DIM FILEN$(999),FILEN(32)
10020 *WIN_DASH
10030 WINDOW(-WININF(0),-WININF(1))-(639-WININF(0),479-WININF(1))
10040 GET@A(WININF(0),WININF(1))-(WININF(2)+WININF(0),WININF(3)+WININF(1)),WINBUF
10099 ' 枠組み
10100 LINE(0,0)-(WININF(2) ,WININF(3) ),PSET,,BF,7
10110 LINE(0,0)-(WININF(2)-1,WININF(3)-1),PSET,,B
10120 LINE(0,0)-(120,16),PSET,,BF
10130 LINE(120,0)-(WININF(2)-1,16),PSET,,BF,%9
10140 SYMBOL(24,3),WINSIGN$,.75!,.75!,7
10149 ' put@座標は別扱い(WINDOWにとらわれないため)
10150 BOX(0,0)=2:BOX(0,1)=2:BOX(0,2)=13:BOX(0,3)=13
10160 PUT@(2-WINDOW(0),2-WINDOW(1))-(13-WINDOW(0),13-WINDOW(1)),ICN_CL&,,7
10169 ' ディレクトリ
10170 LINE(8,20)-STEP(89,17),PSET,,B
10189 ' UP
10190 BOX(10,0)=100:BOX(10,1)=20:BOX(10,2)=115:BOX(10,3)=37
10200 LINE(100,20)-STEP(15,17),PSET,,B
10210 CONNECT(103,26)-STEP(4,-4)-STEP(4,4)
10220 SYMBOL(102,24),"up",.75!,.75!
10229 ' DOWN 118
10230 BOX(11,0)=123:BOX(11,1)=20:BOX(11,2)=228:BOX(11,3)=35:B=11:GOSUB*FR_EL1
10240 SYMBOL(126,22),"ディレクトリ移動",.75!,.75!
10249 ' ファイル
10250 BOX(3,0)=8:BOX(3,1)=40:BOX(3,2)=97:BOX(3,3)=183
10260 LINE(8,40)-STEP(89,143),PSET,,B
10269 ' ロール・バー
10270 IF FILENUM=0 THEN
10280 BOX(5,0)=101:BOX(5,2)=114:BOX(5,1)=41:BOX(5,3)=152
10290 BOX(6,0)=101:BOX(6,2)=114:BOX(6,1)=41:BOX(6,3)=152
10295 BOX(9,0)=100:BOX(9,1)=40:BOX(9,2)=115:BOX(9,3)=183
10300 LINE(100,40)-(115,153),PSET,,B:B=5:GOSUB*MAKE_S
10305 ELSE
10310 B=1:GOSUB*BAR_D
10315 ENDIF
10320 BOX(7,0)=101:BOX(7,2)=114:BOX(7,1)=154:BOX(7,3)=167
10330 LINE(100,153)-(115,168),PSET,,B:B=7:GOSUB*MAKE_S
10340 BOX(8,0)=101:BOX(8,2)=114:BOX(8,1)=169:BOX(8,3)=182
10350 LINE(100,168)-(115,183),PSET,,B:B=8:GOSUB*MAKE_S
10360 PUT@(104-WINDOW(0),157-WINDOW(1))-(111-WINDOW(0),164-WINDOW(1)),ICN_UP&
10370 PUT@(104-WINDOW(0),172-WINDOW(1))-(111-WINDOW(0),179-WINDOW(1)),ICN_DW&
10379 ' ディスク
10390 LINE(123,40)-STEP(18,39),PSET,,B
10410 LINE(144,40)-STEP(63,39),PSET,,B
10430 LINE(210,40)-STEP(18,39),PSET,,B
10439 ' 選択したファイル名
10450 LINE(123,115)-STEP(89,15),PSET,,B
10459 ' 取消
10460 BOX(2,0)=120:BOX(2,1)=138:BOX(2,2)=168:BOX(2,3)=138+12+6:B=2:GOSUB*FR_EL1
10470 SYMBOL(BOX(2,0)+3,BOX(2,1)+3)," 取 消 ",.75!,.75!
10479 ' 実行
10480 BOX(1,0)=160:BOX(1,1)=162:BOX(1,2)=160+6*(11+1):BOX(1,3)=180:B=1:GOSUB*FR_EL2
10490 SYMBOL(BOX(1,0)+3,BOX(1,1)+3)," 実 行 ",.75!,.75!
10499 ' rex_uty
10500 *GET_F_I
10510 IF FILENUM=0 THEN
10520 IF GCRDNBUF$="" THEN
10530 IF CRDCODE=0 THEN
10598 ' rex_utyによる情報の取得
10599 ' カレント・ディスク
10600 CRDCODE=CALLM(0,1)
10615 ENDIF
10629 ' カレント・ディレクトリの取得
10630 GCRDNBUF$=SPACE$(65)
10640 RET&=CALLM(0,2,CRDCODE,VARPTR(GCRDNBUF$))
10650 GCRDNBUF$=LEFT$(GCRDNBUF$,INSTR(GCRDNBUF$," ")-1)
10659 ' ディレクトリ ルートを除く
10660 FOR I=LEN(GCRDNBUF$) TO 1 STEP -1
10670 IF MID$(GCRDNBUF$,I,1)="\" THEN
10680 DIR$=RIGHT$(GCRDNBUF$,LEN(GCRDNBUF$)-I)
10690 IF DIR$="" THEN ROOT=0 ELSE ROOT=-1
10691 I=1
10694 ENDIF
10695 NEXT
10696 ENDIF
10699 ' ファイル名の探索
10700 ' ファイル系関数の初期化
10705 FILEOFFSET=0:FILEN=0
10710 SEARCHFILE$="????????.???"+CHR$(0):SEARCHFILE&=VARPTR(SEARCHFILE$)
10719 ' ファイル数は限界がわからないので、とりあえず1000個分用意
10720 FOR I=0 TO 999
10730 FILEN$(I)=SPACE$(14)
10740 RET&=CALLM(0,0,VARPTR(SEARCHFILE$),VARPTR(FILEN$(I)),16,SGN(I))
10750 IF RET& THEN FILENUM=I:I=999
10755 NEXT
10759 ' ファイル名のソート
10760 IF FILENUM>1 THEN
10761 FOR I=1 TO FILENUM-1
10770 IF FILEN$(I-1)>FILEN$(I)THEN SWAP FILEN$(I-1),FILEN$(I):I=I+(I>1)*2
10774 NEXT
10775 ENDIF
10780 IF DIRBACK$>"" THEN FILEOFFSET=SEARCH(FILEN$,DIRBACK$)+ROOT-FILENBACK:DIRBACK$="":FILENBACK=0
10781 IF FILENUM+ROOT<FILEOFFSET+10 THEN FILEOFFSET=FILENUM+ROOT-10
10782 IF FILEOFFSET<0 THEN FILEOFFSET=0
10785 ENDIF
10799 ' ディスク
10800 SYMBOL(160,43),AKCNV$(CHR$(CRDCODE)),2,2
10819 ' ディレクトリ表示
10820 LINE(8+1,20+1)-STEP(89-2,17-2),PSET,7,BF
10830 SYMBOL(17,23),DIR$,.75!,.75!
10869 ' ファイル
10870 GOSUB*FILE_D
10871 IF B<>15 THEN GOSUB*BAR_D
10899 ' クリック待ち
10900 *WAIT_M
10905 NUL=MOUSE(9):NUL=MOUSE(10)
10910 FOR I=0 TO BOXNUM
10920 PANDB=FNPB(I)
10930 IF PANDB THEN B=I:I=BOXNUM
10935 NEXT
10936 'PRINT "point and box";PANDB,"in box";B
10940 IF MOUSE(2,1) THEN MODE=1:GOTO*WIN_CLOSE
10950 IF MOUSE(2,0)=0 THEN GOSUB*MOUSE:GOTO*WAIT_M
10960 IF PANDB THEN
10961 PANDB=0:PBBACK=0
10970 ON B+1 GOTO *WIN_CLOSE,*GO,*STOP,*SEL,*WRITE,*ROLL_BAR,*BAR_BACK,*RB_UP,*RB_DOWN,*RB_DUMMY,*UP,*DOWN,*LEFT,*RIGHT,*CHENGE,*WIN_MOVE,*WIN_DUMMY
10975 ENDIF
10979 ' ウィンドウ範囲外の処理とくに無いので
10980 WHILE MOUSE(2,0):WEND:GOTO*WAIT_M
10999 '
11999 ' ファイル名描画
12000 *FILE_D
12004 LINE(9,41)-STEP(87,141),PSET,7,BF
12005 IF FILENUM<1 THEN *BAR_D
12006 IF 9<FILENUM+ROOT THEN J=9 ELSE J=FILENUM+ROOT-1
12010 FOR I=0 TO J
12020 IF ROOT AND I+FILEOFFSET=0 THEN
12030 FILEN$="<<親ディレクトリ >>"
12031 ELSE
12040 FILEN$=FILEN$(I-ROOT+FILEOFFSET)
12050 IF LEFT$(FILEN$,1)="D" THEN
12060 FILEN$="<"+MID$(FILEN$,2,12)+">"
12061 ELSE
12065 P=INSTR(3,FILEN$,".")-2
12066 IF 0<P THEN
12070 FILEN$=" "+MID$(FILEN$,2,P)+SPACE$(9-P)+MID$(FILEN$,P+3,3)
12071 ELSE
12072 FILEN$=" "+MID$(FILEN$,2,8)
12073 ENDIF
12074 ENDIF
12075 ENDIF
12077 IF FILEN-1<>I+FILEOFFSET THEN
12079 'LINE(9,41+14*I)-STEP(87,13),PSET,7,BF
12080 SYMBOL(8+3,40+3+14*I),FILEN$,.75!,.75!
12081 ELSE
12082 LINE(9,41+14*I)-STEP(87,15),PSET,,BF
12083 SYMBOL(8+3,40+3+14*I),FILEN$,.75!,.75!,7
12084 ENDIF
12085 NEXT
12086 RETURN
12099 ' ロール・バー描画
12100 *BAR_D
12101 ' Bを壊すので
12102 BBACK=B:B=5
12105 IF FILENUM<1 THEN FILELEN=0 ELSE FILELEN!=112/(FILENUM+ROOT)
12110 BOX(B,1)=41+FILELEN!*FILEOFFSET
12115 IF FILENUM+ROOT>10 THEN BOX(B,3)=BOX(B,1)+FILELEN!*10-1 ELSE BOX(B,3)=152
12130 LINE(100,40)-(115,BOX(B,1)-1),PSET,,BF,%9
12140 LINE(100,BOX(B,1)-1)-(115,BOX(B,3)+1),PSET,,BF,7
12150 LINE(100,BOX(B,3)+1)-(115,153),PSET,,BF,%9
12155 GOSUB*MAKE_S
12159 ' 帰る前にBを復元(*RB_UP、*RB_DOWN)
12160 SWAP B,BBACK:RETURN
12199 ' ウインドウ終了処理ルーチン
12200 *WIN_END
12210 PUT@A(WININF(0),WININF(1))-(WININF(2)+WININF(0),WININF(3)+WININF(1)),WINBUF
12220 ERASE WINBUF,FILEN$,FILEN:WINDOW(0,0)-(639,479):RETURN
12299 '
12300 *WIN_C
13999 ' ウィンドウ消去
14000 *WIN_CLOSE
14005 IF MODE THEN MOUSE 1,WININF(0)+8,WININF(1)+8,1
14010 *WCLOOP
14019 ' 情報のくいちがいが無いように念のため
14020 PANDB=FNPB(0)
14030 IF PANDB<>PBBACK THEN PBBACK=PANDB:LINE(2,2)-(13,13),XOR,%7,BF
14039 ' コンパイラではmouseに式が使えない& if~then while~は×
14040 IF MODE THEN IF MOUSE(2,1) GOTO *WCLOOP
14041 IF MODE=0 THEN IF MOUSE(2,0) GOTO *WCLOOP
14045 MODE=0
14050 IF PANDB THEN FILENAME$="":GOTO*WIN_END ELSE GOTO*WAIT_M
14099 ' ウィンドウ移動
14100 *WIN_MOVE
14102 XOLD=MOUSE(4,0):YOLD=MOUSE(5,0)
14103 MOUSE 4,XOLD-WININF(0),YOLD-WININF(1),639-WININF(0)-WININF(2)+XOLD,479-WININF(1)-WININF(3)+YOLD
14104 MOUSE 1,XOLD,YOLD,0
14109 LINE(0,0)-(WININF(2),WININF(3)),XOR,7,B
14110 WHILE MOUSE(2,0) AND NOT MOUSE(2,1)
14119 X=MOUSE(0)-XOLD:Y=MOUSE(1)-YOLD
14120 IF X<>XBACK OR Y<>YBACK THEN
14121 LINE(XBACK,YBACK)-(WININF(2)+XBACK,WININF(3)+YBACK),XOR,7,B
14122 LINE(X ,Y )-(WININF(2)+X ,WININF(3)+Y ),XOR,7,B
14125 XBACK=X:YBACK=Y
14130 ENDIF
14140 WEND
14141 LINE(X,Y)-(WININF(2)+X,WININF(3)+Y),XOR,7,B
14143 MOUSE 4,0,0,639,479
14145 XBACK=0:YBACK=0
14160 IF (X OR Y)AND MOUSE(2,1)=0 THEN
14165 WININF(0)=WININF(0)+X:WININF(1)=WININF(1)+Y
14170 PUT@A(-WINDOW(0),-WINDOW(1))-(WININF(2)-WINDOW(0),WININF(3)-WINDOW(1)),WINBUF
14175 MOUSE 1,,,1
14179 GOTO*WIN_DASH
14180 ENDIF
14185 MOUSE 1,XOLD,YOLD,1
14186 WHILE MOUSE(2,0):WEND
14190 GOTO*WAIT_M
14199 ' ダミーです
14200 *ROLL_BAR
14290 GOTO*WAIT_M
14299 ' ダミーです
14300 *BAR_BACK
14390 GOTO*WAIT_M
14399 ' 上方向ファイル表示
14400 *RB_UP
14410 WHILE MOUSE(2,0)
14420 IF FNPB(B) THEN
14430 IF REV=0 THEN GOSUB*ERASE_S:REV=1
14440 IF 0<FILEOFFSET THEN
14450 FILEOFFSET=FILEOFFSET-1
14460 GOSUB*BAR_D:GOSUB*FILE_D
14465 ENDIF
14466 ELSE
14470 IF REV THEN GOSUB*MAKE_S:REV=0
14475 ENDIF
14476 WEND
14480 IF REV THEN GOSUB*MAKE_S:REV=0
14490 GOTO*WAIT_M
14499 ' 下方向ファイル表示
14500 *RB_DOWN
14510 WHILE MOUSE(2,0)
14520 IF FNPB(B) THEN
14530 IF REV=0 THEN GOSUB*ERASE_S:REV=1
14540 IF FILENUM+ROOT>FILEOFFSET+10 THEN
14550 FILEOFFSET=FILEOFFSET+1
14560 GOSUB*BAR_D:GOSUB*FILE_D
14565 ENDIF
14566 ELSE
14570 IF REV THEN GOSUB*MAKE_S:REV=0
14575 ENDIF
14576 WEND
14580 IF REV THEN GOSUB*MAKE_S:REV=0
14590 GOTO*WAIT_M
14599 ' ファイル選択動作
14600 *SEL
14610 FILENBACK=FILEN-FILEOFFSET
14615 X=BOX(3,0)+1:Y=BOX(3,1)-13:Z=BOX(3,2)-1:W=BOX(3,1)+2
14619 ' 一度は通るwhileの代わり
14620 *SEL_LOOP
14630 IF FNPB(3) THEN
14640 F=MOUSE(1)+WINDOW(1)-BOX(3,1)-3
14641 IF 0=<F AND F MOD 14<12 THEN FILEN=F\14+1 ELSE CLICKT=-1
14642 IF FILEN<1 OR 10<FILEN OR FILENUM+ROOT<FILEN THEN FILEN=0
14645 ELSE
14650 FILEN=0
14655 ENDIF
14660 IF FILENBACK<>FILEN THEN
14670 IF FILEN THEN LINE(X,Y+FILEN*14)-(Z,W+FILEN*14),XOR,%7,BF
14675 IF 1=<FILENBACK AND FILENBACK=<10 THEN LINE(X,Y+FILENBACK*14)-(Z,W+FILENBACK*14),XOR,%7,BF
14680 FILENBACK=FILEN:CLICKT=-1
14690 ENDIF
14695 IF MOUSE(2,0) THEN *SEL_LOOP
14696 FILENBACK=0
14699 ' 簡単なダブルクリック処理
14700 IF FILEN THEN
14705 FILEN=FILEN+FILEOFFSET
14710 IF TIME MOD 3600=CLICKT THEN
14720 IF FILEN=1 AND ROOT THEN *UP_P
14721 IF LEFT$(FILEN$(FILEN-1-ROOT),1)="D" THEN *DOWN_P
14722 IF LEFT$(FILEN$(FILEN-1-ROOT),1)="F" THEN *WIN_END
14725 ELSE
14730 CLICKT=TIME MOD 3600
14740 IF LEFT$(FILEN$(FILEN-1-ROOT),1)="F" THEN
14750 IF FILENAME$>"" THEN LINE(123,115)-STEP(89,15),PSET,,BF,7
14760 FILENAME$=MID$(FILEN$(FILEN-1-ROOT),2,INSTR(1,FILEN$(FILEN-1-ROOT)," ")-2)
14765 SYMBOL(123+3,115+2),FILENAME$,.75!,.75!
14775 ENDIF
14776 ENDIF
14780 ELSE
14785 CLICKT=-1
14790 IF FILENAME$>"" THEN LINE(123,115)-STEP(89,15),PSET,,BF,7
14795 ENDIF
14799 ' 実行
14800 *GO
14810 WHILE MOUSE(2,0)
14820 PANDB=FNPB(1)
14830 IF PANDB<>PBBACK THEN
14840 PBBACK=PANDB
14849 X=BOX(1,0)+1:Y=BOX(1,1)+1:Z=BOX(1,2)-1:W=BOX(1,3)-1
14850 CONNECT(X+2,Y)-(Z-2,Y)-(Z,Y+2)-(Z,W-2)-(Z-2,W)-(X+2,W)-(X,W-2)-(X,Y+2)-(X+2,Y),%7,XOR,F
14855 ENDIF
14860 WEND
14870 IF PANDB THEN CONNECT(X+2,Y)-(Z-2,Y)-(Z,Y+2)-(Z,W-2)-(Z-2,W)-(X+2,W)-(X,W-2)-(X,Y+2)-(X+2,Y),%7,XOR,F
14879 ' この行は前の行の前に置いても構わない
14880 IF PANDB AND FILENAME$>"" THEN *WIN_END ELSE GOTO*WAIT_M
14899 '
14900 '*stop
14999 '
15000 *UP
15005 X=BOX(B,0)+1:Y=BOX(B,1)+1:Z=BOX(B,2)-1:W=BOX(B,3)-1
15010 WHILE MOUSE(2,0)
15020 PANDB=FNPB(B)
15030 IF PANDB<>PBBACK THEN PBBACK=PANDB:LINE(X,Y)-(Z,W),XOR,%7,BF
15035 WEND
15036 IF PANDB THEN LINE(X,Y)-(Z,W),XOR,%7,BF
15039 IF PANDB=0 OR ROOT=0 THEN *WAIT_M
15040 *UP_P
15051 DIRBACK$="D"+DIR$+SPACE$(13-LEN(DIR$))
15052 FILENP=SEARCH(FILEN,0)-1
15053 IF FILENP=-1 THEN FILENP=0
15054 SWAP FILENBACK,FILEN(FILENP)
15055 IF FILENBACK=0 THEN FILENBACK=3 ELSE FILENBACK=FILENBACK-1
15060 GCRDNBUF$=".."+CHR$(0)
15070 CALLM 0,4,VARPTR(GCRDNBUF$)
15080 GCRDNBUF$="":FILENUM=0
15090 GOTO*GET_F_I
15099 '
15100 *DOWN
15110 WHILE MOUSE(2,0)
15120 PANDB=FNPB(B)
15130 IF PANDB<>PBBACK THEN PBBACK=PANDB:GOSUB*FR_EL_RV
15135 WEND
15136 IF PANDB THEN GOSUB*FR_EL_RV
15139 IF PANDB=0 OR FILEN=0 OR LEFT$(FILEN$(FILEN),1)<>"D" THEN *WAIT_M
15140 *DOWN_P
15145 FILENP=SEARCH(FILEN,0)
15150 FILEN(FILENP)=FILEN-FILEOFFSET:FILEN(FILENP+1)=0
15160 GCRDNBUF$=MID$(FILEN$(FILEN-1-ROOT),2,INSTR(FILEN$(FILEN-1-ROOT)," ")-2)+CHR$(0)
15170 CALLM 0,4,VARPTR(GCRDNBUF$)
15180 GCRDNBUF$="":FILENUM=0
15190 GOTO*GET_F_I
15199 '
17986 *RB_DUMMY
17987 *WIN_DUMMY
17990 *STOP
17992 *WRITE
17995 *LEFT
17996 *RIGHT
17997 *CHENGE
17998 *DUMMY WHILE MOUSE(2,0):WEND:GOTO*WAIT_M
17999 ' 描画関連サブルーチン
18000 *FR_EL1
18010 X=BOX(B,0):Y=BOX(B,1):Z=BOX(B,2):W=BOX(B,3)':I=4:GOSUB*FR_EL
18020 CONNECT(X,Y+4)-(X+1,Y+1)-(X+4,Y)-(Z-4,Y)-(Z-1,Y+1)-(Z,Y+4)-(Z,W-4)-(Z-1,W-1)-(Z-4,W)-(X+4,W)-(X+1,W-1)-(X,W-4)-(X,Y+4)
18025 RETURN
18029 '
18030 *FR_EL2
18040 X=BOX(B,0):Y=BOX(B,1):Z=BOX(B,2):W=BOX(B,3)':I=4:GOSUB*FR_EL
18045 CONNECT(X,Y+4)-(X+1,Y+1)-(X+4,Y)-(Z-4,Y)-(Z-1,Y+1)-(Z,Y+4)-(Z,W-4)-(Z-1,W-1)-(Z-4,W)-(X+4,W)-(X+1,W-1)-(X,W-4)-(X,Y+4)
18049 DEF PEN 0,2
18050 X=BOX(B,0)-3:Y=BOX(B,1)-3:Z=BOX(B,2)+2:W=BOX(B,3)+2:I=7:GOSUB*FR_EL
18051 DEF PEN 0,1
18055 RETURN
18059 '
18060 *FR_EL_RV
18065 X=BOX(B,0)+1:Y=BOX(B,1)+1:Z=BOX(B,2)-1:W=BOX(B,3)-1
18070 CONNECT(X+2,Y)-(Z-2,Y)-(Z,Y+2)-(Z,W-2)-(Z-2,W)-(X+2,W)-(X,W-2)-(X,Y+2)-(X+2,Y),%7,XOR,F
18075 RETURN
18079 '
18080 *FR_EL
18082 LINE(X+I,Y)-(Z-I,Y),PSET:CIRCLE (Z-I,Y+I),I,,,.75!,0
18084 LINE(Z,Y+I)-(Z,W-I),PSET:CIRCLE (Z-I,W-I),I,,,0,.25!
18086 LINE(Z-I,W)-(X+I,W),PSET:CIRCLE (X+I,W-I),I,,,.25!,.5!
18088 LINE(X,W-I)-(X,Y+I),PSET:CIRCLE (X+I,Y+I),I,,,.5!,.75!
18090 RETURN
18099 '
18100 *MAKE_S
18110 X=BOX(B,0):Y=BOX(B,1):Z=BOX(B,2):W=BOX(B,3)
18120 CONNECT(Z,Y+1)-(Z,W)-(X+1,W)-(X+2,W-1)-(Z-1,W-1)-(Z-1,Y+2)
18125 RETURN
18129 '
18130 *ERASE_S
18140 X=BOX(B,0):Y=BOX(B,1):Z=BOX(B,2):W=BOX(B,3)
18150 CONNECT(Z,Y+1)-(Z,W)-(X+1,W)-(X+2,W-1)-(Z-1,W-1)-(Z-1,Y+2),7
18155 RETURN
18159 '
29999 ' おまけ
30000 *MOUSE
30020 MBX=SGN(MOUSE(9)\32):MBY=SGN(MOUSE(10)\28)
30030 IF MBX OR MBY THEN
30040 IF MBX THEN MBX=(MBX+1)\2 ELSE MBX=MB AND 1
30050 IF MBY THEN MBY= MBY+1 ELSE MBY=MB AND 2
30055 '
30060 IF MB<>MBX+MBY THEN MB=MBX+MBY:MOUSE 2,M_AND$(MB),M_DOT$(MB),MBX*15,MBY*7.5!
30080 ENDIF
30090 RETURN
30095 '